package com.tanhua.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.commons.lang3.StringUtils;

import java.io.UnsupportedEncodingException;
import java.util.Base64;
import java.util.Date;
import java.util.Map;

public class JwtUilt {

    /**
     * 设置token的过期时间
     */
    private static final Integer TOKEN_TIME_OUT = 1 * 3600 * 1000;

    /**
     * jwt的盐
     */
    private static final String TOKEN_SECRET = "com.tanhua";

    /**
     * 通过jwt获取token
     * @param map 接收的参数
     * @return 返回token
     */
    public static String  createToken(Map map) {

        //当前时间
        long currentTimeMillis = System.currentTimeMillis();

        try {
            return Jwts.builder()
                    // 加密算法 ,对盐再次加密
                    .signWith(SignatureAlgorithm.HS256, Base64.getEncoder().encode(TOKEN_SECRET.getBytes("UTF-8")))
                    //设置token的过期时间
                    .setExpiration(new Date(currentTimeMillis + TOKEN_TIME_OUT))
                    .addClaims(map)
                    .compact();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 解析token
     * @param token
     * @return 返回的是jwt最终产生的一个集合
     */
    public static Claims getClaims(String token){
        try {
            return Jwts.parser()
                    //设置盐加密算法
                    .setSigningKey(Base64.getEncoder().encode(TOKEN_SECRET.getBytes("UTF-8")))
                    .parseClaimsJws(token)
                    .getBody();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 判断token 是否失效
     * @param token 传入的token
     * @return false失效
     */
    public static boolean verifyToken(String token){
        //判断token是否为空字符或null
        if (StringUtils.isEmpty(token)){
            return false;
        }
        try {
            Claims body = Jwts.parser()
                    //设置盐加密算法
                    .setSigningKey(Base64.getEncoder().encode(TOKEN_SECRET.getBytes("UTF-8")))
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            return false;
        }
        return true;
    }
}
